package com.syedu.day13;

import java.util.Scanner;
import java.util.Stack;

/**
 * description：List接口的实现类: Stack,它继承与Vector
 * 特点: 线程安全的可以用来模拟栈结构的集合
 * 它提供了很多直观的操作集合元素的方法,可以直接用来当做是栈元素的操作
 *
 * @author Administrator
 * @date 2022/3/28 13:35
 */
public class StackDemo {
    public static void main(String[] args) {
        /*Stack<Integer> stack = new Stack<>();
        //添加元素到栈中
        stack.push(10);
        stack.push(20);
        stack.push(30);

        //查看栈顶元素
        System.out.println(stack.peek());

        //删除栈顶元素
        stack.pop();
        stack.forEach(System.out::println);*/

        /**
         * 经典面试题: 模拟HTML或者Java代码中括号匹配原则
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请您输入括号: ");
        String content = scanner.nextLine();
        //把字符串转换成字符数组
        char[] chars = content.toCharArray();
        //定义集合来模拟堆栈
        Stack<Character> stack = new Stack<>();
        //把数组第一个元素添加到集合中
        stack.push(chars[0]);
        //从第二个元素开始循环数组
        for(int i = 1;i < chars.length;i++){
            //输入的括号(从第二个开始)
            char c = chars[i];
            //判断当前栈顶是否有元素
            //当前集合(栈顶)元素
            if(stack.empty()){
                stack.push(c);
            }else{
                char first = stack.peek();
                //判断
                if(c == ')' && first=='(' || c == ']' && first=='[' || c == '}' && first=='{'){
                    //配对,则删除栈顶元素
                    stack.pop();
                }else{
                    //不配对,则在栈顶添加元素
                    stack.push(c);
                }
            }
        }
        //判断集合是否为空
        if(stack.empty()){
            System.out.println("匹配成功!");
        }else{
            System.out.println("匹配失败!");
        }
    }
}